package com.hcss.common.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.UUID;

import javax.imageio.ImageIO;

public class FontImage {
	// 默认格式
	private static final String FORMAT_NAME = "JPG";
	
	 private static final int WIDTH = 100;
	 // 默认 高度
	  private static final int HEIGHT =100;
	/**	  
	 ** 获取 图片 	  
	 ** @param content 内容	 
	 ** @param font  字体	 
	 ** @param width 宽	 
	 ** @param height 高	 
	 ** @return	  */	 
	public static BufferedImage getImage(String content,Font font,Integer width,Integer height){
		width=width==null?WIDTH:width;	
		height=height==null?HEIGHT:height;	
		if(null==font) {
            font = new Font("Serif", Font.BOLD, 16);
        }
		return createImage(content, font, width, height);	 
		
	}
	 /**	 
	  *  * 获取 图片	  
	  *  * @param content 内容	 
	  *  * @param width 宽	  
	  *  * @param height 高	  
	  *  * @return	  
	  *  */	 
	public static BufferedImage getImage(String content,Integer width,Integer height){ 
		return getImage(content, null,width, height);	
		
	}
	
	/**	  
	 * * 获取图片	  
	 * * @param content 内容	  
	 * * @return	  
	 * */	
	public static BufferedImage getImage(String content){
		return getImage(content, null, null);	
		
	}
	
	/**	  *  获取图片	  
	 * * @param content 内容	  
	 * * @param font 字体	  
	 * * @param width 宽	  
	 * * @param height 高	  
	 * * @param destPath 输出路径	  
	 * * @throws IOException 	  
	 * */	 
	public static void getImage(String content,Font font ,Integer width,Integer height,String destPath) throws IOException{	
		mkdirs(destPath);	    
		String file = UUID.randomUUID().toString()+".jpg";
		ImageIO.write(getImage(content,font,width,height),FORMAT_NAME, new File(destPath+"/"+file));  	
		
	}
	
	/**	    
	 * * 创建 目录	    
	 * * @param destPath	    
	 * */	   
	public static void mkdirs(String destPath) {
		File file =new File(destPath);//当文件夹不存在时，mkdirs会自动创建多层目录，区别于mkdir．(mkdir如果父目录不存在则会抛出异常)	       
		if (!file.exists() && !file.isDirectory()) {
			file.mkdirs();	
		}
	}

	/**	
	 *  * 创建图片
	 *  * @param content 内容	   
	 *  * @param font  字体	   
	 *  * @param width 宽	   
	 *  * @param height 高	   
	 *  * @return	   
	 *  */	 
	private static BufferedImage createImage(String content,Font font,Integer width,Integer height){  
		BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);   
		Graphics2D g2 = (Graphics2D)bi.getGraphics();   	
		g2.setBackground(Color.WHITE);   
		g2.clearRect(0, 0, width, height);   
		g2.setPaint(Color.BLACK); 
		g2.setFont(font);
		FontRenderContext context = g2.getFontRenderContext();
		Rectangle2D bounds = font.getStringBounds(content, context);
		double x = (width - bounds.getWidth()) / 2;   	      
		double y = (height - bounds.getHeight()) / 2;   
		double ascent = -bounds.getY();   	   
		double baseY = y + ascent;  
		int fontlen=getMarkLength(content,g2);
		int line = fontlen/width+1;//文字长度相对于图片宽度应该有多少行
		int ys = height-(line + 1)*font.getSize();
//		System.out.println("文字总长度:"+fontlen + ",图片宽度:"+ width +",字符个数:"+ content.length());
		int tempX ;
		int tempY ;
        if(line==1){
        	 tempX =(int)x;
        	 tempY =(int)baseY;
        }else{
        	tempX=0;
        	tempY=(int)y;
        }
		//文字叠加,自动换行叠加
		int tempCharLen =0;//单字符长度
		int tempLineLen =0;//单行字符总长度临时计算
		StringBuffer sb =new StringBuffer();
		for(int i=0; i<content.length(); i++) {
		char tempChar = content.charAt(i);
		tempCharLen = getCharLen(tempChar, g2);
		tempLineLen += tempCharLen;
		if(tempLineLen >= width) {
		//长度已经满一行,进行文字叠加
		g2.drawString(sb.toString(), tempX,tempY);
		sb.delete(0, sb.length());//清空内容,重新追加
		tempY += font.getSize();
		tempLineLen =0;
		line-=1;
		}
		sb.append(tempChar);//追加字符
		}
		if(line==1){
			g2.drawString(sb.toString(), tempX, tempY);
			sb.delete(0, sb.length());//清空内容,重新追加
		}
		return bi;	
		}
	
	/**
	* 获取文字总长度
	*@param markContent文字
	*@paramg
	*@return文字总长度
	*/
	public static int getMarkLength(String markContent, Graphics2D g) {
	 return g.getFontMetrics(g.getFont()).charsWidth(markContent.toCharArray(),0,markContent.length());
	
	}
	
	public static int getCharLen(char c, Graphics2D g) {
		return g.getFontMetrics(g.getFont()).charWidth(c);
	}

}
